home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / gui / precog2_1.lha / Precognition2_1 / src / src.lha / Library / VScroller.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-16  |  12.8 KB  |  424 lines

  1. /* ==========================================================================
  2. **
  3. **                         VScroller.c
  4. **
  5. ** ©1991 WILLISoft
  6. **
  7. ** ==========================================================================
  8. */
  9.  
  10. #include "parms.h" /* added for proper prototyping -- EDB */
  11. #include "Positioner.h"
  12. #include "PositionerClass.h"
  13.  
  14. #include <stdio.h>
  15. #include "minmax.h"
  16. #include "VScroller.h"
  17. #include "VScrollerClass.h"
  18. #include "EmbossedGadgetClass.h"
  19. #ifndef __GNUC__
  20. #include <clib/exec_protos.h>
  21. #include <clib/intuition_protos.h>
  22. #include <clib/graphics_protos.h>
  23. #include <clib/diskfont_protos.h>
  24. #endif
  25. #ifdef __GNUC__
  26. #include <proto/exec.h>
  27. #include <proto/intuition.h>
  28. #include <proto/graphics.h>
  29. #include <proto/diskfont.h>
  30. #endif
  31. #ifdef __SASC
  32. #include <proto/exec.h>
  33. #include <proto/intuition.h>
  34. #include <proto/graphics.h>
  35. #include <proto/diskfont.h>
  36. #endif
  37. #include "amigamem.h"
  38.  
  39. void VScroller_SetInteractorWindow( VScroller *self, pcgWindow *window )
  40. {
  41.    self->posr.IaWindow = window;
  42.    SetInteractorWindow( (Interactor *)&self->vslider,   window );
  43.    SetInteractorWindow( (Interactor *)&self->uparrow,   window );
  44.    SetInteractorWindow( (Interactor *)&self->downarrow, window );
  45. }
  46.  
  47.  
  48.  
  49. void VScroller_CleanUp( VScroller *self )
  50. {
  51.    CleanUp( (PObject *)&self->vslider   );
  52.    CleanUp( (PObject *)&self->uparrow   );
  53.    CleanUp( (PObject *)&self->downarrow );
  54. }
  55.  
  56.  
  57. tPoint VScroller_SetLocation(  VScroller *self,
  58.                                PIXELS     LeftEdge,
  59.                                PIXELS     TopEdge )
  60. {
  61.  
  62.    Point Up_size, Slider_size;
  63.    Point Up_pos,  Down_pos;
  64.  
  65.  
  66.    Up_size     = Size( (GraphicObject *)&self->uparrow );
  67.    Slider_size = Size( (GraphicObject *)&self->vslider );
  68.  
  69.    SetLocation( (GraphicObject *)&self->vslider, LeftEdge, TopEdge );
  70.  
  71.    Up_pos.x = LeftEdge;
  72.    Up_pos.y = TopEdge + Slider_size.y;
  73.    SetLocation( (GraphicObject *)&self->uparrow, Up_pos.x, Up_pos.y );
  74.  
  75.    Down_pos.x = LeftEdge;
  76.    Down_pos.y = Up_pos.y + Up_size.y;
  77.    SetLocation( (GraphicObject *)&self->downarrow, Down_pos.x, Down_pos.y );
  78.  
  79.    self->posr.Location.x = LeftEdge;
  80.    self->posr.Location.y = TopEdge;
  81.  
  82.    return Location( (GraphicObject *)self );
  83. }
  84.  
  85.  
  86. tPoint VScroller_private_AskSize(  VScroller *self,
  87.                                    PIXELS     Width,
  88.                                    PIXELS     Height,
  89.                                    Point     *Up_size,
  90.                                    Point     *Down_size,
  91.                                    Point     *Slider_size )
  92. {
  93.    Point size;
  94.  
  95.    *Up_size   = AskSize( (GraphicObject *)&self->uparrow,   0, 0 );
  96.    *Down_size = AskSize( (GraphicObject *)&self->downarrow, 0, 0 );
  97.  
  98.    Slider_size->y = Height - (Up_size->y + Down_size->y);
  99.    Slider_size->x = MAX( Up_size->x, Down_size->x );
  100.  
  101.    *Slider_size = AskSize( (GraphicObject *)&self->vslider, Slider_size->x, Slider_size->y );
  102.  
  103.    size.x = Slider_size->x;
  104.    size.y = Slider_size->y + Up_size->y + Down_size->y;
  105.  
  106.    return size;
  107. }
  108.  
  109.  
  110. tPoint VScroller_AskSize(  VScroller *self,
  111.                            PIXELS     Width,
  112.                            PIXELS     Height )
  113. {
  114.    Point Up_size, Down_size, Slider_size, size;
  115.  
  116.    size = VScroller_private_AskSize( self, Width, Height,
  117.             &Up_size, &Down_size, &Slider_size );
  118.  
  119.    return size;
  120. }
  121.  
  122.  
  123. tPoint VScroller_SetSize(  VScroller *self,
  124.                            PIXELS     Width,
  125.                            PIXELS     Height )
  126. {
  127.  
  128.    tPoint Up_size, Down_size, Slider_size, size;
  129.    tPoint pos;
  130.  
  131.    size = VScroller_private_AskSize( self, Width, Height,
  132.             &Up_size, &Down_size, &Slider_size );
  133.  
  134.    SetSize( (GraphicObject *)&self->uparrow,   Up_size.x,   Up_size.y );
  135.    SetSize( (GraphicObject *)&self->downarrow, Down_size.x, Down_size.y );
  136.    SetSize( (GraphicObject *)&self->vslider,   Slider_size.x, Slider_size.y );
  137.  
  138.    /* Now must fix the positions of uparrow, down arrow. */
  139.  
  140.    pos = Location( (GraphicObject *)self );
  141.    SetLocation( (GraphicObject *)self, pos.x, pos.y );
  142.    self->posr.Size = size;
  143.  
  144.    AlignText( &self->vslider.eg.LabelText, Size( (GraphicObject *)self ) );
  145.  
  146.    return size;
  147. }
  148.  
  149.  
  150. void VScroller_Render( VScroller *self, RastPort *RPort )
  151. {
  152.    Render( (GraphicObject *)&self->vslider,   RPort );
  153.    Render( (GraphicObject *)&self->uparrow,   RPort );
  154.    Render( (GraphicObject *)&self->downarrow, RPort );
  155. }
  156.  
  157.  
  158. Gadget *VScroller_FirstGadget( VScroller *self )
  159. {
  160.    return FirstGadget( (Interactor *)&self->vslider );
  161. }
  162.  
  163.  
  164. USHORT VScroller_nGadgets( VScroller *self )
  165. {
  166.    return( (USHORT) ( nGadgets( (Interactor *)&self->vslider )
  167.                       + nGadgets( (Interactor *)&self->uparrow )
  168.                       + nGadgets( (Interactor *)&self->downarrow ) )
  169.          );
  170. }
  171.  
  172.  
  173. ULONG VScroller_IDCMPFlags( VScroller *self )
  174. {
  175.    return IDCMPFlags( (Interactor *)&self->vslider )
  176.         | IDCMPFlags( (Interactor *)&self->uparrow )
  177.         | IDCMPFlags( (Interactor *)&self->downarrow );
  178. }
  179.  
  180. USHORT VScroller_ClaimEvent( VScroller *self, IntuiMessage *event )
  181. {
  182.    return( (USHORT)( ClaimEvent( (Interactor *)&self->vslider,   event )
  183.         | ClaimEvent( (Interactor *)&self->uparrow,   event )
  184.         | ClaimEvent( (Interactor *)&self->downarrow, event ) ) );
  185.  
  186. }
  187.  
  188. BOOL VScroller_EnableIactor( VScroller *self, BOOL enable )
  189. {
  190.    EnableIactor( (Interactor *)&self->vslider,   enable );
  191.    EnableIactor( (Interactor *)&self->uparrow,   enable );
  192.    EnableIactor( (Interactor *)&self->downarrow, enable );
  193.    return enable;
  194. }
  195.  
  196. USHORT VScroller_Respond( VScroller *self, IntuiMessage *event )
  197. {
  198.    USHORT vsr = 0; /* Vertical slider response  */
  199.    USHORT uar = 0; /* uparrow response          */
  200.    USHORT dar = 0; /* down arrow response       */
  201.  
  202.    vsr = Respond( (Interactor *)&self->vslider, event );
  203.  
  204.    if( ! ( vsr & CONSUMED_EVENT ) )
  205.    {
  206.       /* Up Arrow */
  207.       uar = Respond( (Interactor *)&self->uparrow, event );
  208.  
  209.       if( ( uar & CHANGED_STATE ) && ( Value( (Valuator *)&self->uparrow ) ) )
  210.       {
  211.          SlideLower( &self->vslider );
  212.       }
  213.  
  214.       if( !( uar & CONSUMED_EVENT ) )
  215.       {
  216.          /* Down Arrow */
  217.          dar = Respond( (Interactor *)&self->downarrow, event );
  218.          if( ( dar & CHANGED_STATE ) && ( Value( (Valuator *)&self->downarrow ) ) )
  219.          {
  220.             SlideHigher( &self->vslider );
  221.          }
  222.       }
  223.    }
  224.  
  225.    return( (USHORT) ( vsr | uar | dar ) );
  226. }
  227.  
  228.  
  229. void VScroller_Refresh( VScroller *self )
  230. {
  231.    pcgWindow *window;
  232.  
  233.    if( window = InteractorWindow( (Interactor *)self ) )
  234.    {
  235.       Refresh( (Interactor *)&self->vslider   );
  236.       Refresh( (Interactor *)&self->uparrow   );
  237.       Refresh( (Interactor *)&self->downarrow );
  238.    }
  239. }
  240.  
  241. /* Changed to long -- EDB */
  242. long VScroller_Value( VScroller *self )
  243. {
  244.    return Value( (Valuator *)&self->vslider );
  245. }
  246.  
  247. /* Changed to long  and LONG -- EDB */
  248. long VScroller_SetValue( VScroller *self, LONG position )
  249. {
  250.    return SetValue( (Valuator *)&self->vslider, position );
  251. }
  252.  
  253. USHORT VScroller_KnobSize( VScroller *self )
  254. {
  255.    return KnobSize( (Positioner *)&self->vslider );
  256. }
  257.  
  258. USHORT VScroller_SetKnobSize( VScroller *self, USHORT knobsize )
  259. {
  260.    return SetKnobSize( (Positioner *)&self->vslider, knobsize );
  261. }
  262.  
  263. char *VScroller_Title( VScroller *self )
  264. {
  265.    return Title( (GraphicObject *)&self->vslider );
  266. }
  267.  
  268. BOOL VScroller_SetTitle( VScroller *self,
  269.                          char      *title )
  270. {
  271.    SetTitle( (GraphicObject *)&self->vslider, title );
  272.    AlignText( &self->vslider.eg.LabelText, Size( (GraphicObject *)self ) );
  273.  
  274.    return TRUE;
  275. }
  276.  
  277. /* EDB -- Added Default Font Support Methods */
  278. extern TextAttr go_DefaultFont;
  279.  
  280. TextAttr *VScroller_DefaultFont( VScroller *self )
  281. {
  282.    if( self->vslider.eg.LabelText.ITextFont != NULL )
  283.       return( self->vslider.eg.LabelText.ITextFont );
  284.    else return &go_DefaultFont;  /* Topaz80 */
  285. }
  286.  
  287. BOOL VScroller_SetDefaultFont( VScroller *self, TextAttr *default_font )
  288. {
  289.    struct TextFont *myfont;
  290.  
  291.    if( default_font != NULL )
  292.    {      /* check to see if font is really available */
  293.      if( myfont = OpenDiskFont( default_font ) )
  294.        {
  295.        self->vslider.eg.LabelText.ITextFont = default_font;
  296.  
  297.        CloseFont( myfont );
  298.        /* Get ourselves back into alignment */
  299.        AlignText( &self->vslider.eg.LabelText, Size( (GraphicObject *)self ) );
  300.        return TRUE;
  301.        }
  302.      else return FALSE; /* font is not available */
  303.    }
  304.    else return FALSE;   /* pointer was invalid */
  305. }
  306.  
  307. AlignInfo *VScroller_TextAlignment( VScroller *self )
  308. {
  309.    return( &(self->vslider.eg.LabelText.alignment) );
  310. }
  311.  
  312. BOOL VScroller_SetTextAlignment( VScroller *self,
  313.                                            UBYTE     Flags,
  314.                                            BYTE      Xpad,
  315.                                            BYTE      Ypad )
  316. {
  317.    self->vslider.eg.LabelText.alignment.Flags = Flags;
  318.    self->vslider.eg.LabelText.alignment.Xpad  = Xpad;
  319.    self->vslider.eg.LabelText.alignment.Ypad  = Ypad;
  320.    AlignText( &self->vslider.eg.LabelText, Size( (GraphicObject *)self ) );
  321.    return TRUE;
  322. }
  323.  
  324.  
  325.  
  326.  
  327. BOOL VScroller_elaborated = FALSE;
  328.  
  329. struct PositionerClass VScroller_Class;
  330.  
  331. void VScrollerClass_Init( struct PositionerClass *class )
  332. {
  333.    PositionerClass_Init( class );
  334.    class->isa                 = PositionerClass();
  335.    class->ClassName           = "VScroller";
  336. /*   class->New                 = VScroller_New;*/
  337.    class->CleanUp             = (void(*)(PObject *))VScroller_CleanUp;
  338.    class->SetLocation         = (Point(*)(GraphicObject *, PIXELS, PIXELS))VScroller_SetLocation;
  339.    class->AskSize             = (Point(*)(GraphicObject *, PIXELS, PIXELS))VScroller_AskSize;
  340.    class->SetSize             = (Point(*)(GraphicObject *, PIXELS, PIXELS))VScroller_SetSize;
  341.    class->SizeFlags           = GraphicObject_SizeFlagsY;
  342.    class->Render              = (void(*)(GraphicObject *, RastPort *))VScroller_Render;
  343.    class->SetInteractorWindow = (void(*)(Interactor *, struct pcgWindow *))VScroller_SetInteractorWindow;
  344.    class->FirstGadget         = (Gadget*(*)(Interactor *))VScroller_FirstGadget;
  345.    class->nGadgets            = (USHORT(*)(Interactor *))VScroller_nGadgets;
  346.    class->IDCMPFlags          = (ULONG(*)(Interactor *))VScroller_IDCMPFlags;
  347.    class->ClaimEvent          = (USHORT(*)(Interactor *, IntuiMessage *))VScroller_ClaimEvent;
  348.    class->Respond             = (USHORT(*)(Interactor *, IntuiMessage *))VScroller_Respond;
  349.    class->Refresh             = (void(*)(Interactor *))VScroller_Refresh;
  350.    class->EnableIactor        = (BOOL(*)(Interactor *, BOOL))VScroller_EnableIactor;
  351.    class->isEnabled           = (BOOL(*)(Interactor *))EmbossedGadget_isEnabled;
  352.    class->Activate            = NULL;
  353.    class->isActive            = NULL;
  354.    class->SetKnobSize         = (USHORT(*)(Positioner *, USHORT))VScroller_SetKnobSize;
  355.    class->SetValue            = (LONG(*)(Valuator *, LONG))VScroller_SetValue;
  356.    class->KnobSize            = (USHORT(*)(Positioner *))VScroller_KnobSize;
  357.    class->Value               = (LONG(*)(Valuator *))VScroller_Value;
  358.    class->Title               = (char*(*)(GraphicObject *))VScroller_Title;
  359.    class->SetTitle            = (BOOL(*)(GraphicObject *, char *))VScroller_SetTitle;
  360.    class->DefaultFont         = (TextAttr*(*)(GraphicObject *))VScroller_DefaultFont;
  361.    class->SetDefaultFont      = (BOOL(*)(GraphicObject *, TextAttr *))VScroller_SetDefaultFont;
  362.    class->TextAlignment       = (AlignInfo*(*)(GraphicObject *))VScroller_TextAlignment;
  363.    class->SetTextAlignment    = (BOOL(*)(GraphicObject *, UBYTE, BYTE, BYTE))VScroller_SetTextAlignment;
  364.  
  365. }
  366.  
  367.  
  368. struct PositionerClass *VScrollerClass( void )
  369. {
  370.    if( ! VScroller_elaborated )
  371.    {
  372.       VScrollerClass_Init( &VScroller_Class );
  373.       VScroller_elaborated = TRUE;
  374.    }
  375.  
  376.    return &VScroller_Class;
  377. }
  378.  
  379.  
  380.  
  381.  
  382. void VScroller_Init( VScroller  *self,
  383.                      PIXELS      LeftEdge,
  384.                      PIXELS      TopEdge,
  385.                      PIXELS      Height,
  386.                      pcg_3DPens  Pens,
  387.                      char       *label )
  388. {
  389.    Gadget *g;
  390.  
  391.    Positioner_Init( (Positioner *)self );
  392.  
  393.    self->posr.isa           = VScrollerClass();
  394.    self->posr.Next          = NULL;
  395.    self->posr.PObjectName    = NULL;
  396.    self->posr.Location.x    = LeftEdge;
  397.    self->posr.Location.y    = TopEdge;
  398.    self->Pens               = Pens;
  399.  
  400.    /*
  401.    ** Initialize objects with dumb values, just so that they are now
  402.    ** proper objects.
  403.    */
  404.  
  405.    ArrowGadget_Init( &self->uparrow,   LeftEdge, TopEdge,
  406.       UpArrow, Pens );
  407.    ArrowGadget_Init( &self->downarrow, LeftEdge, TopEdge,
  408.       DownArrow, Pens );
  409.  
  410.    VSlider_Init( &self->vslider,       LeftEdge, TopEdge, 0, 0, Pens, NULL );
  411.  
  412.    self->vslider.eg.Next = &self->uparrow;
  413.    self->uparrow.Next    = &self->downarrow;
  414.  
  415.    SetSize( (GraphicObject *)self, 0, Height );
  416.    SetTitle( (GraphicObject *)self, label );
  417.    SetTextAlignment( (GraphicObject *)self, tx_XCENTER | tx_BOTTOM | tx_OUTSIDE, STD_XPAD, STD_YPAD );
  418.  
  419.    /* Chain the gadgets together. */
  420.    g = FirstGadget( (Interactor *)self );
  421.    ChainGadgets( g,  FirstGadget( (Interactor *)&self->uparrow ) );
  422.    ChainGadgets( g,  FirstGadget( (Interactor *)&self->downarrow ) );
  423. }
  424.